#include"EventloopThreadPool.h"
#include"EventloopThread.h"

EventloopThreadPool::EventloopThreadPool(Eventloop *baseloop,const std::string &nameArg)
    :baseloop_(baseloop)
    ,name_(nameArg)
    ,started_(false)
    ,numThreads_(0)
    ,next_(0)
{
}
EventloopThreadPool::~EventloopThreadPool()//loop是在线程栈上创建的，不需要手动释放资源
{
//这里啥都不用做
}
//相当于开始启动设置的数量的线程

void EventloopThreadPool::start(const ThreadInitCallback &cb)
{
    started_=true;
    for(int i=0;i<numThreads_;++i)//用户设置了线程数量
    {
        char buf[name_.size()+32];
        snprintf(buf,sizeof buf,"%s%d",name_.c_str(),i);
        EventloopThread *t=new EventloopThread(cb,buf);
        threads_.push_back(std::unique_ptr<EventloopThread>(t));
        loops_.push_back(t->startLoop());//底层创建线程，绑定一个新的Eventloop，并返回该loop的地址
    }

    if(numThreads_==0 && cb)//用户没有设置线程的数量，之运行着baseloop，进这个分支，
    {
        cb(baseloop_);
    }
}
//如果工作在多线程中，baseloop_默认以轮循的方式分配channel给subloop
Eventloop* EventloopThreadPool::getNextloop()//通过轮循获取下一个loop
{
   Eventloop* loop=baseloop_;
   if(!loops_.empty())
   {
    loop=loops_[next_];
    ++next_;
    if(next_>=loops_.size())
    {
        next_=0;
    }
   }
   return loop;
}
std::vector<Eventloop*> EventloopThreadPool::getAllLoops()
{
    if(loops_.empty())
    {
        return std::vector<Eventloop*>(1,baseloop_);
    }
    else
    {
       return loops_;
    }
}